package cn.xwt.weidisk.service;

import cn.xwt.weidisk.pojo.dao.FileDo;
import cn.xwt.weidisk.pojo.dao.RecycleFileDo;
import cn.xwt.weidisk.pojo.dto.*;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author 薛慰涛
 */
public interface FileService {


    /**
     * 获取文件上传链接
     * @param fileDo 文件信息
     * @return 上传链接
     */
    Resp getFileUploadUrl(FileDo fileDo);

    /**
     * 保存图片文件缩略图
     * @param thumbnail base64Url:缩略图的base64编码  key:原图在cos中的名称
     * @return boolean
     */
    boolean saveThumbnail(ThumbnailData thumbnail);

    /**
     * 新建文件夹
     * @param fileDo 文件夹信息
     * @return boolean true新建成功
     */
    boolean insertFolder(FileDo fileDo);

    /**
     * 获取文件下载链接
     * @param name 要下载的文件名
     * @param key 要下载的文件的key
     * @return 下载链接
     */
    String getFileDownloadUrl(String name, String key);

    /**
     * 根据用户id查询文件列表
     * @param uid 用户id
     * @param path 文件路径
     * @return List<FileDo>
     */
    List<FileDo> getAllList(Long uid, String path);

    /**
     * 修改文件名
     * @param renameFileData
     *              fid:文件id
     *              uid: 用户id
     *              originalName:原文件名
     *              newName:修改后的文件名
     *              path:文件路径
     *              type:文件类型
     * @return boolean
     */
    boolean updateName(RenameFileData renameFileData);

    /**
     * 查询当前文件夹下的所有文件
     * @param parentDir path
     * @return list<FileDo>
     */
    List<FileDo> selectChildren(FileDo parentDir);

    /**
     * 删除文件列表
     * @param file id, rid, uid
     */
    void deleteFile(FileDo file);

    /**
     * 获取文件夹树
     * @param uid 用户id
     * @return FolderTree
     */
    FolderTree getFolderTree(Long uid);

    /**
     * 移动文件
     * @param moveData 文件移动信息
     * @param uid 用户id
     * @return Resp
     */
    Resp moveFile(MoveData moveData, Long uid);


    /**
     * 根据分类查询文件
     * @param uid 用户id
     * @param type 类型
     * @return List<FileDo>
     */
    List<FileDo> selectListByType(Long uid, String type);

    /**
     * 查询其它类型的文件
     * @param uid 用户id
     * @return List<FileDo>
     */
    List<FileDo> selectOtherList(Long uid);

    /**
     * 获取图片列表
     * @param uid 用户id
     * @return List<ImageData>
     */
    List<ImageData> getImageList(Long uid);

    /**
     * 获取文件预览链接
     * @param key 文件key
     * @return String 文件链接
     */
    String getPreviewUrl(String key);

    /**
     * 通过文件id查询文件
     * @param id 文件id
     * @return FileDo
     */
    FileDo selectFileById(Long id);

    /**
     * 判断还原时空间是否足够
     * @param recycleFileList recycleFile
     * @param uid 用户id
     * @return boolean
     */
    boolean enableRecycle(List<RecycleFileDo> recycleFileList, Long uid);

    /**
     * 还原文件
     * @param file id, name, type, key, size, path, uid
     * @return boolean
     */
    boolean revertFile(FileDo file);

    /**
     * 彻底删除文件
     * @param ridList 要删除的rid
     * @param uid 用户id
     */
    void deleteFileListComplete(List<Long> ridList, Long uid);

    /**
     * 获取已经使用的容量
     * @param uid 用户id
     * @return integer
     */
    Integer getUsed(Long uid);
}
